package model.siec.definicja;

import model.CLiczba;
import model.siec.definicja.IFunkcjaAktywacja;
import model.siec.definicja.IFunkcjaWynikInterpretacja;
import model.siec.definicja.ISiecNeuronowa;


public class CSiecNeuronowaPrototyp implements ISiecNeuronowa {

	public final static CLiczba E = new CLiczba(Math.E);
	
	private int[] 				neuronyWarstwaLiczba ;
	private CLiczba[][][] 		wagaWartosci;
	private CLiczba[][] 		neuronWejscieWartosci;
	private CLiczba[][] 		neuronWartosci;
	private CLiczba[][] 		neuronBladWartosci;
	private CLiczba				uczenieWspolczynnik;

	private IFunkcjaAktywacja funkcjaAktywacja;
	private IFunkcjaWynikInterpretacja funkcjaWynikInterpretacja;
	
	public CSiecNeuronowaPrototyp() {}

	public CSiecNeuronowaPrototyp(
			int warstwyLiczba, 
			int maxNeuronyWarstwyLiczba,
			int [] neuronyWarstwyLiczba,
			IFunkcjaAktywacja funkcjaAktywacja,
			IFunkcjaWynikInterpretacja funkcjaWynikInterpretacja, 
			CLiczba uczenieWspolczynnik) 
	{
		this.neuronyWarstwaLiczba 	= neuronyWarstwyLiczba;
		this.wagaWartosci 			= new CLiczba[warstwyLiczba][maxNeuronyWarstwyLiczba][maxNeuronyWarstwyLiczba];
		this.neuronWejscieWartosci 	= new CLiczba[warstwyLiczba][maxNeuronyWarstwyLiczba];
		this.neuronWartosci			= new CLiczba[warstwyLiczba][maxNeuronyWarstwyLiczba];
		this.neuronBladWartosci		= new CLiczba[warstwyLiczba][maxNeuronyWarstwyLiczba];
		this.uczenieWspolczynnik 	= uczenieWspolczynnik;
		this.funkcjaAktywacja 		= funkcjaAktywacja;
		this.funkcjaWynikInterpretacja = funkcjaWynikInterpretacja;		
	}

	public int getWarstwaNeuronyLiczba(int warstwa) {
		return neuronyWarstwaLiczba[warstwa];
	}

	public int getWarstwyLiczba() {
		return 3;
	}

	public CLiczba getWagaWartosc(
			int warstwaNumer, 
			int neuronWarstwyNumer,
			int neuronWarstwyWyzszejNumer) {
		return wagaWartosci[warstwaNumer][neuronWarstwyNumer][neuronWarstwyWyzszejNumer];
	}

	public CLiczba getNeuronWartosc(int warstwaNumer, int neuronWarstwyNumer) {
		return neuronWartosci[warstwaNumer][neuronWarstwyNumer];
	}
	
	public void setNeuronWartosc(
			int warstwaNumer, 
			int neuronWarstwyNumer,
			CLiczba neuronWartosc) {
		neuronWartosci[warstwaNumer][neuronWarstwyNumer] = neuronWartosc;
	}

	public void setWagaWartosc(
			int warstwaNumer, 
			int neuronWarstwyNumer,
			int neuronWarstwyWyzszejNumer, 
			CLiczba wagaWartosc) {
		wagaWartosci[warstwaNumer][neuronWarstwyNumer][neuronWarstwyWyzszejNumer] = wagaWartosc;
	}

	public CLiczba getNeuronWejscieWartosc(
			int warstwaNumer,
			int neuronWarstwyNumer) {
		return neuronWejscieWartosci[warstwaNumer][neuronWarstwyNumer];
	}

	public void setNeuronWejscieWartosc(
			int warstwaNumer,
			int neuronWarstwyNumer, 
			CLiczba neuronWartosc) {
		neuronWejscieWartosci[warstwaNumer][neuronWarstwyNumer] = neuronWartosc;
	}

//	public CLiczba getFunkcjaWartosc(CLiczba argument) {
//		return funkcjaAktywacja.getFunkcjaWartosc(argument);
//	}
//
//	public CLiczba getFunkcjaPochodnaWartosc(CLiczba argument) {
//		return funkcjaAktywacja.getFunkcjaPochodnaWartosc(argument);
//	}

	public CLiczba getUczenieWspolczynnik() {
		return uczenieWspolczynnik;
	}

	public CLiczba getNeuronBladWartosc(int warstwaNumer, int neuronWarstwyNumer) {
		return neuronBladWartosci[warstwaNumer][neuronWarstwyNumer];
	}

	public void setNeuronBlad(
			int warstwaNumer, 
			int neuronWarstwyNumer,
			CLiczba neuronBlad) {
		neuronBladWartosci[warstwaNumer][neuronWarstwyNumer] = neuronBlad;
	}

	public IFunkcjaWynikInterpretacja getFunkcjaWynikInterpretacja() {
		return funkcjaWynikInterpretacja;
	}

	public IFunkcjaAktywacja getFunkcjaAktywacja() {
		return funkcjaAktywacja;
	}

	public void setFunkcjaAktywacja(IFunkcjaAktywacja funkcjaAktywacja) {
		this.funkcjaAktywacja = funkcjaAktywacja;
	}
	
	public String toString() {
		String wynik = "";
		int warstwyLiczba = getWarstwyLiczba()-1;
		for (int i=0; i<getWarstwaNeuronyLiczba(warstwyLiczba); i++) {
			wynik += i+": "+getNeuronWartosc(warstwyLiczba, i)+" ";
		}

		return wynik;
	}
}
